package com.engine.salary.service;

import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO;
import com.engine.salary.entity.salarysob.dto.SalarySobItemFormDTO;
import com.engine.salary.entity.salarysob.param.SalarySobItemSaveParam;
import com.engine.salary.entity.salarysob.po.SalarySobItemPO;

import java.util.Collection;
import java.util.List;

/**
 * @description: 薪资账套的薪资项目副本
 * @author: xiajun
 * @modified By: xiajun
 * @date: Created in 1/17/22 7:26 PM
 * @version:v1.0
 */
public interface SalarySobItemService {

    /**
     * 查询所有薪资账套的薪资项目副本
     *
     * @return
     */
    List<SalarySobItemPO> list();

    /**
     * 根据薪资账套id查询薪资账套的薪资项目副本
     *
     * @param salarySobId 薪资账套的id
     * @return
     */
    List<SalarySobItemPO> listBySalarySobId(Long salarySobId);

    /**
     * 根据薪资账套id和薪资项目分类查询薪资账套的薪资项目副本
     *
     */
    List<SalarySobItemPO> listBySalarySobIdAndGroupId(Long salarySobId,Collection<Long> salarySobItemGroupIds);

    /**
     * 根据薪资账套id查询薪资账套的薪资项目副本
     *
     * @param salarySobIds 薪资账套的id
     * @return
     */
    List<SalarySobItemPO> listBySalarySobIds(Collection<Long> salarySobIds);

    /**
     * 根据薪资账套id、薪资项目id查询薪资账套的薪资项目副本
     *
     * @param salarySobId   薪资账套id
     * @param salaryItemIds 薪资项目id
     * @return
     */
    List<SalarySobItemPO> listBySalarySobIdAndSalaryItemIdNotIn(Long salarySobId, Collection<Long> salaryItemIds);

    /**
     * 根据薪资项目id查询薪资账套的薪资项目副本
     *
     * @param salaryItemIds 薪资项目的主键id
     * @return
     */
    List<SalarySobItemPO> listBySalaryItemIds(Collection<Long> salaryItemIds);

    /**
     * 根据薪资账套id查询薪资账套的薪资项目副本所关联的薪资项目
     *
     * @param salarySobId 薪资账套id
     * @return
     */
    List<SalaryItemPO> listBySalarySobId4SalaryItem(Long salarySobId);

    /**
     * 根据薪资账套id获取薪资账套的薪资项目聚合（员工信息、薪资项目副本、薪资项目分类）
     *
     * @param salarySobId
     * @return
     */
    SalarySobItemAggregateDTO getAggregateBySalarySobId(Long salarySobId);

    /**
     * 根据薪资核算id获取薪资账套的薪资项目聚合（员工信息、薪资项目副本、薪资项目分类）
     * @param salaryAcctRecordId 核算记录id
     * @param hideItem  true过滤隐藏项目。false显示隐藏项目
     * @return
     */
    SalarySobItemAggregateDTO getAggregateByRecordId(Long salaryAcctRecordId, boolean hideItem);

    /**
     * 根据薪资账套id获取薪资账套的薪资项目聚合（员工信息、薪资项目副本、薪资项目分类）(不包含已设置为隐藏的)
     * @return
     */
    SalarySobItemAggregateDTO getAggregateWithItemHideBySalarySobId(Long salaryAcctRecordId,Long salarySobId, boolean isBackCalc);

    /**
     * 保存
     *
     * @param saveParam  保存参数
     */
    void save(SalarySobItemSaveParam saveParam);

    /**
     * 批量保存
     *
     * @param salarySobItemPOS 薪资账套的薪资项目副本
     */
    void batchSave(Collection<SalarySobItemPO> salarySobItemPOS);

    /**
     * 根据薪资账套id删除薪资账套的薪资项目副本
     *
     */
    void deleteBySalarySobIds(Collection<Long> salarySobIds);

    /**
     * 根据薪资账套id删除薪资项目是否显示
     *
     */
    void deleteItemShowBySalarySobIds(Collection<Long> salarySobIds);

    /**
     * 薪资项目的详情
     */
    SalarySobItemFormDTO getSalaryItemForm(SalarySobItemPO param);

    void update(SalarySobItemPO po);

    List<SalarySobItemPO> getConfig(Long salarySobId);
}
